/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package manejadores;

import com.akcess.exception.Datos_atributoException;
import com.akcess.exception.RecursoException;
import com.akcess.exception.RecursoRecordCountException;
import com.akcess.exception.Recurso_movilException;
import com.akcess.exception.Usuario_tiene_rolException;
import com.akcess.vo.*;
import com.akcess.impl.*;
import com.akcess.dao.*;
import com.akcess.exception.RolException;
import java.sql.*;
import java.util.*;
/**
 *
 * @author Ramon
 */
public class ManejadorRecursoMovil {
        private Connection conexion = null;
        /**
         * Acepta como parametro una conexion a la base de datos.
         * @param con
         */
        public ManejadorRecursoMovil(Connection con) {
                this.conexion = con;
        }
        /**
         * El agregado de un recurso implica el insertado en 4 tablas de la base de datos, la tabla Recursos,
         * la tabla recursos moviles, la tabla Datos_atributos,  y la tabla ubicaciones. 
         * Como se utilizan varias los datos de varias clases DAO, hacemos que la clase recurso movil, herede de todas
         * las clases necesarias.
         * El id del recurso es asignado por nosotros.
         * 
         * @param rm Contiene todos los datos necesarios para insertar el nuevo recurso movil.
         * @throws com.akcess.exception.RecursoException
         * @throws com.akcess.exception.Recurso_movilException
         * @throws com.akcess.exception.RecursoRecordCountException
         * @throws com.akcess.exception.Datos_atributoException
         */
        public void AgregarRM(Recurso_movil rm) throws RecursoException, Recurso_movilException, RecursoRecordCountException, Datos_atributoException
        {
            RecursoRecordCount RCUser;
            int CantRegistros = 0;
            int id_nuevoRecurso = 0;
            Datos_atributo [] vecDatos;


            //Le asigno un id_recurso al nuevo recurso que llega
            RecursoRecordCountDAOImpl RCDaoUser = new RecursoRecordCountDAOImpl();
            RCUser = RCDaoUser.getRecordCount(this.conexion);
            CantRegistros = RCUser.getCount();
            id_nuevoRecurso = CantRegistros + 1;
            rm.setId_recurso(id_nuevoRecurso);//Aca guardo el nuevo id
            //Inserto en las dos tablas
            RecursoDAOImpl manejaR=new RecursoDAOImpl();
            Recurso_movilDAOImpl manejaRM= new Recurso_movilDAOImpl();
            manejaR.insert(rm, this.conexion);
            manejaRM.insert(rm, this.conexion);
            //Inserto los datos del recurso
            vecDatos=rm.getDatos();
            for (int i = 0; i < vecDatos.length; i++) {
                Datos_atributo datos_atributo = vecDatos[i];
                datos_atributo.setId_recurso(id_nuevoRecurso);
                Datos_atributoDAOImpl manejarDatos=new Datos_atributoDAOImpl();
                manejarDatos.insert(datos_atributo, this.conexion);
            }
            
        }
        /**
         * El borrado de un recurso movil se realiza de forma logica.
         * Antes de realizar el borrado logico, se verifica que el recurso no tenga reservas hechas no canceladas
         * o solicitudes pendientes del mismo. Para poder borrar un recurso primero se deben cancelar todas las 
         * reservas y anular todas las solicitudes.
         * @param id Es el id del recurso que se desea borrar.
         * @throws com.akcess.exception.RecursoException
         */
        public void BorrarRM(int id) throws RecursoException 
        {
            //Me conecto a la BD           
            
                RecursoPK recursoPK = new RecursoPK();
                recursoPK.setId_recurso((long)id);
                RecursoDAOImpl manejadorRecurso = new RecursoDAOImpl();
                Recurso recurso = manejadorRecurso.findByPrimaryKey(recursoPK, this.conexion);
                recurso.setBorrado(true);
                int cantResultado=manejadorRecurso.borrar(recursoPK, this.conexion);
                if(cantResultado==0)
                    throw new RecursoException("El recurso no puede ser borrado.. Hay dependencias");
                
           
        }
        /**
         * Recupera todos los recursos moviles que se encuentran en la base de datos.
         * @return Un vector de recurso_movil, que contiene a TODOS los recursos moviles.
         * @throws com.akcess.exception.Recurso_movilException
         */
        public Recurso_movil[] listarRecursos() throws Recurso_movilException
        {
            Recurso_movil[] listaRecurso = null;

            Recurso_movilDAOImpl manejadorRecurso = new Recurso_movilDAOImpl();
            listaRecurso = manejadorRecurso.findAll(this.conexion);
            return listaRecurso;
        }
        /**
         * Dado un id de recurso retorna el recurso movil con el id especificado.
         * @param id_recurso
         * @return Un unico recurso movil.
         * @throws com.akcess.exception.Recurso_movilException
         * @throws com.akcess.exception.Datos_atributoException
         */
        public Recurso_movil ObtenerRM(long id_recurso) throws Recurso_movilException, Datos_atributoException
        {
            Recurso_movil rm= new Recurso_movil();
            Datos_atributo []vectorDatos= null; 
            Recurso_movilDAOImpl manejadorRecurso = new Recurso_movilDAOImpl();
            rm = manejadorRecurso.findByPrimaryKey(id_recurso, this.conexion);
            //Busco los atributos del recurso con sus datos y los meto en el recurso movil.
            Datos_atributoDAOImpl manejarDA= new Datos_atributoDAOImpl();
            vectorDatos=manejarDA.findById_recurso(id_recurso, this.conexion);
            rm.setDatos(vectorDatos);
            return rm;
        } 
        /**
         * Modifica los datos que tienen los recursos recurso moviles, es muy parecido al agregar recurso movil,
         * solo que en este caso solo actualiza la base de datos.
         * @param rm Es un objeto recurso_movil que contiene todos los datos nuevos del recurso.
         * @throws com.akcess.exception.RecursoException
         * @throws com.akcess.exception.Recurso_movilException
         * @throws com.akcess.exception.Datos_atributoException
         */
        public void ModificarRM(Recurso_movil rm) throws RecursoException, Recurso_movilException, Datos_atributoException 
        {
           
           
            Datos_atributo [] vecDatos;


            //Modifico en las dos tablas
            RecursoDAOImpl manejaR=new RecursoDAOImpl();
            Recurso_movilDAOImpl manejaRM= new Recurso_movilDAOImpl();
            RecursoPK recursopk =new RecursoPK(rm.getId_recurso());
            Recurso_movilPK rmPK= new Recurso_movilPK(rm.getId_recurso());
            manejaR.update(recursopk,rm, this.conexion);
            manejaRM.update(rmPK,rm, this.conexion);
            
            //Inserto los datos del recurso
            vecDatos=rm.getDatos();
            for (int i = 0; i < vecDatos.length; i++) {
                Datos_atributo da = vecDatos[i];
                Datos_atributoPK daPK= new Datos_atributoPK(da.getId_tipo_recurso(),da.getId_atributos(),rm.getId_recurso());
                Datos_atributoDAOImpl manejarDatos=new Datos_atributoDAOImpl();
                manejarDatos.update(daPK,da, this.conexion);
            }
            
        }
        /**
         * Recupera todos los recursos moviles que son de un tipo determinado.
         * @param id_tipo Es id del tipo de recurso movil que es administrado en otro modulo.
         * @return Retorna un vector que contiene todos los recursos moviles de un tipo dado.
         * @throws com.akcess.exception.Recurso_movilException
         */
        public Recurso_movil [] ObtenerRMdeTipo(int id_tipo) throws Recurso_movilException
        {
            Recurso_movil []rm;
            Datos_atributo []vectorDatos= null; 
            Recurso_movilDAOImpl manejadorRecurso = new Recurso_movilDAOImpl();
            rm = manejadorRecurso.findByTipoDeRecurso(id_tipo, this.conexion);
            return rm;
        }
        
}
